有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JPA中的java刷新实体

我对如何刷新数据库中已有实体的状态感到困惑。更具体地说,假设我使用如下代码持久化了“实体”:

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();
entityManager.close();

由于我关闭了EntityManager,我的实体实例被分离。现在假设我有其他对象使用这个实体实例。如果我想从数据库中获取该实体的新状态,我几乎不能使用em.refresh(),因为该实体已分离。em.merge()方法返回一个托管实例,由于它不是我的对象的同一个实例,这可能是一个问题。我可以预见两种解决方案:

  1. 在我的实体对象中创建一个新方法,该方法使用给定的实体实例更新其状态
  2. 不关闭实体管理器(暗示!)

那么,在这种情况下我应该怎么做?如何刷新实体对象的状态而不丢失其他对象对它的所有引用?想法


共 (2) 个答案

  1. # 1 楼答案

    通过刷新&;避免对实体进行更改;在持久化后分离,可以实现Cloneable接口&;然后相应地处理克隆的实体

    // -
    
    XEntity cloneX = (XEntity) entity.clone();
    
    cloneX = entityManager.merge(cloneX);/* Persisting & getting synchronized copy */ 
    // entityManager.refresh(cloneX); /* not need */
    
    cloneX.copyTo(entity); // Add required changes back to entity if any
    
    // -
    
  2. # 2 楼答案

    如果实体A引用分离的实体B,则合并B返回B',并刷新B'。如果合并A,A将把B的引用改为B'

    A  -> B  (merge) ->B'
                        (refresh)
                        /
    merge A      -/